/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package frontera.dao;

import control.comparaciones.Comparacion;
import control.filtros.Filtro;
import frontera.interfaz.Tupla;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.Query;

/**
 *
 * @author tuareg
 */
public class DAOT<T> extends DAO<T> {

	public DAOT(String nombreEntidad) {
		super(nombreEntidad);
	}

	@Override
	public ArrayList<T> buscar(ArrayList<Tupla<Filtro<T>, String>> informacion, Comparacion comparacion) {
		boolean ret = false;
		EntityManager em = emf.createEntityManager();
		ArrayList<T> resultado = new ArrayList<T>();
		String query = "SELECT " + DAO.nombreVariableReferencia + " FROM " + nombreEntidad + " " + DAO.nombreVariableReferencia;
		query += " WHERE " + DAO.nombreVariableReferencia + ".ultimaVersion = 1" + ((informacion.isEmpty()) ? "" : " AND");
		Filtro<T> filtro;
		for (int i = 0; i < informacion.size() - 2; i++) {
			filtro = informacion.get(i).getA();
			query += comparacion.comparar(filtro) + "AND";
		}
		if (!informacion.isEmpty()) {
			filtro = informacion.get(informacion.size() - 1).getA();
			query += comparacion.comparar(filtro);
			query = query.substring(0, query.length() - 1);
			Query q = em.createQuery(query);
			for (Tupla<Filtro<T>, String> tupla : informacion) {
				q.setParameter(DAO.prefijoVariables + DAO.quitarEspeciales(tupla.getA().getNombreAtributo()), comparacion.prepararCadenaDeBusqueda(tupla.getB()));
			}
			try {
				for (Object a : q.getResultList()) {
					resultado.add((T) a);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				em.close();
				return resultado;
			}
		}
		return resultado;
	}

	@Override
	public boolean actualizar(T viejaEntidad, T nuevaEntidad) {
		throw new UnsupportedOperationException("Not supported yet.");
	}
}
